<?php

namespace App\Jobs;

use App\Models\V1\BasicCustomers;
use Carbon\Carbon;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Log;
use JPush\Client as JPush;

class CustomerExprireRemindPushJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        //发送推送
        $this->customerExpireRemind();
    }

    /**
     * 判断所有的客户服务是否到期，到期就发送到期推送
     * @return void
     */
    public function customerExpireRemind()
    {
        $customers = BasicCustomers::all();
        foreach ($customers as $customer){
            // 获取客户的签约时间
            $signDate = $customer['contract_sign_date'];
            // 获取客户的服务期限
            $serverLimit = $customer['serve_time_limit'];
            // 获取到期前提醒的天数
            $expireRemindDay = $customer['expire_remind_time'];
            // 获取服务到期的日期
            $expireDate = Carbon::parse($signDate)->modify('+'.($serverLimit*12).'months');
            // 获取服务到期前$expireRemindDay天的日期
            $expireRemindDate = Carbon::parse($expireDate)->subDays($expireRemindDay);
            // 判断当前时间是否处于到期前提醒的日期和到期日期之间
            $flag = Carbon::now()->between($expireRemindDate,$expireDate);
            Log::info('flag',['flag'=>$flag]);
            Log::info('$expireDate',['expireDate'=>$expireDate]);
            Log::info('$expireRemindDate',['expireRemindDate'=>$expireRemindDate]);
            if ($flag){
                $ids = ['admin','ma001'];
                $data = array(
                    'userIds' => $ids,
                    'customer_name' => $customer['name'],
                    'server_expire_date' => $expireDate,
                    'type' => '2' //服务到期提醒推送
                );
                // 发送推送
                $this->sendPush($data);
            }

        }

    }


    /**
     * 发送推送
     * @param $item
     * @param $finished
     * @return bool
     */
    protected function sendPush($item)
    {

        // 推送目标
        $targetUser = $item['userIds'];
        // 客户名称
        $customer = $item['customer_name'];
        // 服务到期的日期
        $server_expire_date = $item['server_expire_date'];

        $strMsg = '[通知] ' . $customer . '的服务将于' . $server_expire_date . '到期';
        $user_ids = $targetUser;
        $alert = $strMsg;
        $extras = [
            'type' => $item['type']
        ];

        $log = new \Monolog\Logger('push');
        $log->pushHandler(new \Monolog\Handler\StreamHandler(storage_path('logs/laravel-pushinfo.log'), \Monolog\Logger::INFO));
        $log->addInfo('user_ids:',$user_ids);
        $app_key = config('jpush.appKey');
        $app_secret = config('jpush.appSecret');
        $client = new JPush($app_key, $app_secret);

        if (empty($extras)) {
            $push_payload = $client->push()
                ->setPlatform(array('ios', 'android'))
                ->addAlias($user_ids)
                ->iosNotification($alert)
                ->androidNotification($alert)
                ->options(array(
                    // time_to_live: 表示离线消息保留时长(秒)，
                    // 推送当前用户不在线时，为该用户保留多长时间的离线消息，以便其上线时再次推送。
                    'time_to_live' => 5*24*60*60,

                    // apns_production: 表示APNs是否生产环境，
                    // True 表示推送生产环境，False 表示要推送开发环境；如果不指定则默认为推送生产环境
                    'apns_production' => false
                ));
        } else {
            $push_payload = $client->push()
                ->setPlatform(array('ios', 'android'))
                ->addAlias($user_ids)
                ->iosNotification($alert, array(
                    'extras' => $extras,
                ))
                ->androidNotification($alert, array(
                    'extras' => $extras,
                ))
                ->options(array(
                    // time_to_live: 表示离线消息保留时长(秒)，
                    // 推送当前用户不在线时，为该用户保留多长时间的离线消息，以便其上线时再次推送。
                    'time_to_live' => 5*24*60*60,

                    // apns_production: 表示APNs是否生产环境，
                    // True 表示推送生产环境，False 表示要推送开发环境；
                    //如果不指定则为推送生产环境。但注意，JPush 服务端 SDK 默认设置为推送 “开发环境”。

                    'apns_production' => false
                ));
        }
        try {
            $push_payload->send();
            return true;
        } catch (\JPush\Exceptions\APIConnectionException $e) {
            return false;
        } catch (\JPush\Exceptions\APIRequestException $e) {
            return false;
        }
    }

}
